﻿#ifndef __SS_LE_NETWORK_MGR_H__
#define __SS_LE_NETWORK_MGR_H__
#include "thread/ssMsgEngine.h"
#include "message/ssMsgIdDef.h"
#include "message/ssNetMsgHead.h"
#include "ssLeServerThread.h"
#include "ssLeSession.h"
#include <map>
#include <vector>

namespace StarSeeker
{

class ssLeNetwork : public ssMsgEngine
{
public:
	ssLeNetwork();
	~ssLeNetwork();
	//启动网络服务
	bool StartNetWork(const char* ip, const u16 port, bool isClient);
	//停止网络服务
	void StopNetWork();
	//消息处理
	virtual void HandleMessage(ssMsg_s &m);
	//获取唯一的session(客户端只有一个连接)
	u32 GetUniqueSession();
	//网络连接是否正常
	bool IsConnect();
	//设置读写缓冲区
	void SetRWSize(u32 len);
	//是否处理粘包，0不处理，1按照ssNetMsgHead处理
	void SetParsePackageMode(u8 mode);
	//返回连接个数
	u32 GetSessionCount();
	//返回处理粘包方式
	u8 GetParsePackageMode();
	//通知线程发送数据
	void DoSendData(u32 sessionId, const char* buf, u32 len);
	void DoBroadcastData(const char* buf, u32 len);
	//通知线程关闭socket
	void DoCloseSocket(u32 sessionId);
protected:
	//查找session
	ssLeSession* FindSession(u32 id);
	//处理网络消息
	virtual void OnSessionMessage(u32 sessionID, u32 ip, u32 msgID, char* data, ssNetMsgHead* head);
	//连接断开后
	virtual void OnSessionClose(u32 sessionID, u32 reason);
	//连接建立后
	virtual void OnNewSession(u32 sessionID);
	//线程间消息
	virtual void OnThreadMessage(u32 msgID, ulint param1, ulint param2);
	//断线重连
	void Reconnect();

	ssLeServerThread			m_netThread;
	std::map<u32, ssLeSession*>	m_sessionTable;
	u8							m_parsePackageMode;
};

}
#endif
